// 编码: 很重要
// 1. 前端我们使用的时候, 基本上用不到考虑编码, 后端需要读取操作文件, 需要用到编码
// 前端早期是不能操作文件的, 无法操作二进制,  node 实现了一个 Buffer用于描述内存的

// 内存: 2 二进制数据  Buffer 是 16 进制. 目的是为了短,容易阅读.

// 基本的进制转换.  node 只支持 utf8

/**
 * 在utf8编码中:
 *   一个汉字是 3 个字节.
 *  1 个字节有 8 个位(二进制) 组成.
 */

// 0.1 + 0.2 为什么不等于 0.3 ?
// 因为计算机并不是直接相加的, 而是把两个值都转化成了 2 进制来计算的.


// base64 编码
// base64 在开发中能替换掉路径, 而且可以用于传输. 比如说中文.(没有加密功能)
// base64 是一个编码规范.

// 1 个汉字 3 个字节, 一个字节 8 个位  一共 3 * 8 = 24 位

// 一个汉字 24 个位, 那我要把它转成 6 * 4 的格式, 这就是 base64中 64的由来

//   3 * 8 => 4 * 6 () 以前3个字节一个汉字, 现在 4 个字节一个汉字(所以使用base64转化后的结果都会比之前打1/3)

// base64 的转换规则
// Buffer
let r = Buffer.from("杨") // 把一个汉字变成16进制
console.log(r); // e6 9d a8

// 把16进制转二进制
console.log((0xe6).toString(2));
console.log((0x9d).toString(2));
console.log((0xa8).toString(2));

// 以前的编码: 11100110 10011101 10101000  => 24 位 3b

//  00111001 00101001 00110110 00101000             4b
console.log(parseInt('00111001', 2));
console.log(parseInt('00101001', 2));
console.log(parseInt('00110110', 2));
console.log(parseInt('00101000', 2));
// 57 41 54 40        // 这个值永远不会大于64
let str = 'ABCDEFGXYJKLMNOPQRSTUVWXYZ'
str += str.toLowerCase();
str += '0123456789+/' // 总共 64 个字符

console.log(str[57] + str[41] + str[54] + str[40]); // 5p2o 得出来的就是 杨 的base64 编码 5p2o

// base只是一种编码规则. 但是 utf8 / gbk 是字符集
